package com.hym.myobserve4;

/**
 * 测试主程
 * 
 * */
public class Client {

	
	/**韩非子生活的总次数*/
	private static int sum=0;
	public static void main(String[] args) throws InterruptedException {
		// 定义韩非子
		HanFeiZi hanFeiZi = new HanFeiZi();
		startHanFeiziLive(hanFeiZi,2);
		//韩非子生活了一段时间李斯出现了，并且开始监控
		System.out.println("李斯开始监控韩非子");
		LiSi liSi = new LiSi();
		//设置监控
		hanFeiZi.addObsever(liSi);
		//韩非子被监视（观察）过后的一段生活
		startHanFeiziLive(hanFeiZi,3);
		//突然某一天秦王就把李斯给杀了
		kill(liSi,hanFeiZi);
		startHanFeiziLive(hanFeiZi,2);
		System.out.println("韩非子一共娱乐或吃放了"+sum+"次");
		
	    //场景中有了新的业务，秦国的李斯被杀过后，大王派王思观察HanFeizi的吃饭娱乐行为，
		//同时要观察HanFeiZi是否有把妹行为。
		WangSi wangSi=new WangSi();
		hanFeiZi.addObsever(wangSi);
		hanFeiZi.baMeizi();
		//扩展新的观查者，对被观察的行为进行扩展都非常方便，而且观察者和被观察者的通用接口
		//无需做任何修改，代码维护和扩展都很便捷，符合了软件设计中遵循的开闭原则

	}

	/**
	 * 
	 * @param hanFeiZi
	 * @param count  娱乐和吃饭的总次数
	 * @throws InterruptedException
	 */
	private static void startHanFeiziLive(HanFeiZi hanFeiZi,int count)
			throws InterruptedException {
		// 为模拟业务，此处用循环来模拟李斯10次吃饭和10次娱乐
		for (int i = 0; i < count; i++) {
			sum++;
			// 前10次i是偶数的时候李斯吃饭
			if (i < count/2) {
				// 后10次i是奇数的时候李斯吃饭
				if (i % 2 == 0) {
					// 韩非子吃饭
					hanFeiZi.haveBreakfast(sum);
				} else {
					hanFeiZi.haveFun(sum);
				}
			} else {
				// 后10次i是奇数的时候李斯吃饭
				if (i % 2 == 1) {
					// 韩非子吃饭
					hanFeiZi.haveBreakfast(sum);
				} else {
					hanFeiZi.haveFun(sum);
				}
			}

			Thread.sleep(1000 * 2);
			
		}
	}
	
	/**
	 * 李斯被杀害
	 * @param lisi
	 */
	public static void kill(IObserver lisi,HanFeiZi hanFeiZi){
		System.out.println("======观察者李斯被杀害========");
		//韩非子不能再持有lisi的引用，否则java回收机制不能及时回收lisi实例
		//hanFeiZi.setILisi(null);//实际开发中可以提供remove方法
		hanFeiZi.mIObservers.remove(lisi);
		lisi=null;
	}

}
